#ifndef SESSIONFRIENDAREA_H
#define SESSIONFRIENDAREA_H

#pragma once
#include <QWidget>
#include <QScrollArea>
#include <QScrollBar>
#include <QVBoxLayout>
#include <QPushButton>
#include <QGridLayout>
#include <QLabel>
#include <QStyleOption>
#include <QPainter>

#include "model/datacenter.h"

////////////////////////////////////////////////
/// 滚动区域中的 Item 的类型
////////////////////////////////////////////////
enum ItemType{
    SessionItemType,
    FriendItemType,
    ApplyItemType
};

////////////////////////////////////////////////
/// 整个滚动区域的实现
////////////////////////////////////////////////
class SessionFriendArea : public QScrollArea {
    Q_OBJECT
public:
    explicit SessionFriendArea(QWidget *parent = nullptr);

    // 清楚所有的item
    void clear();
    // 添加item
    void addItem(ItemType itemType, const QString& id, const QIcon& avatar, const QString& name, const QString& text);

    // 选中某个指定的 item, 通过 index 下标来进行选择
    void clickItem(int index);
private:
    QWidget* container;
signals:
};

////////////////////////////////////////////////
/// 滚动区域中的item
////////////////////////////////////////////////
class SessionFriendItem : public QWidget {
    Q_OBJECT
public:
    explicit SessionFriendItem(QWidget* owner, const QIcon& avatar, const QString& name, const QString& text);

    // 重载paintEvent函数，可以在自定义子类中设置样式
    void paintEvent(QPaintEvent* event) override;

    // 特定按钮比如button有clicked信号，自定义类可以重载特定函数来实现类似效果
    // 鼠标点击触发调用该函数
    void mousePressEvent(QMouseEvent* event) override;
    // 鼠标进入该控件区域触发调用该函数
    void enterEvent(QEnterEvent* event) override;
    // 鼠标离开该控件区域触发调用该函数
    void leaveEvent(QEvent* event) override;

    // 该控件被选中
    void select();

    // 点击触发调用select()函数后，根据不同的item执行不同的功能,用来实现多态
    virtual void active();
private:
    // owner 就指向了上述的 SessionFriendArea
    QWidget* owner;

    // 这个变量用来表示当前 Item 是否是 "选中" 状态
    bool selected = false;

protected:
    // 可以让类访问，比如在好友申请item，需要移除messageLabel
    QLabel* messageLabel;
};

//////////////////////////////////////////////////////////
/// 会话 Item 的实现
//////////////////////////////////////////////////////////

class SessionItem : public SessionFriendItem {
    Q_OBJECT

public:
    SessionItem(QWidget* owner, const QString& chatSessionId, const QIcon& avatar,
                const QString& name, const QString& lastMessage);

    // 点击之后, 右侧窗口windowRight要加载会话的历史消息列表
    void active();

    void updateLastMessage(const QString& chatSessionId);
private:
    // 当前会话 id
    QString chatSessionId;
    QString text;

};

//////////////////////////////////////////////////////////
/// 好友 Item 的实现
//////////////////////////////////////////////////////////

class FriendItem : public SessionFriendItem {
    Q_OBJECT

public:
    FriendItem(QWidget* owner, const QString& userId, const QIcon& avatar, const QString& name,
               const QString& description);

    // 点击之后, 要激活对应的会话列表元素
    void active();

private:
    // 好友的用户id
    QString userId;
};

//////////////////////////////////////////////////////////
/// 好友申请 Item 的实现
//////////////////////////////////////////////////////////
class ApplyItem : public SessionFriendItem {
    Q_OBJECT

public:
    // 此处不需要显示一个 附加的文本了. 比上面的两个 Item 的构造函数, 少了一个参数
    ApplyItem(QWidget* owner, const QString& userId, const QIcon& avatar, const QString& name);

    // 这个函数本身就不需要实现任何内容
    void active();

    void acceptFriendApply();
    void rejectFriendApply();
private:
    // 申请人的 userId
    QString userId;
};
#endif // SESSIONFRIENDAREA_H
